// Package api internal/api/department_api.go
package api

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"gozrd-admin-api/internal/entity/dto"
	"gozrd-admin-api/internal/entity/model"
	"gozrd-admin-api/internal/repository"
	"gozrd-admin-api/internal/service"
	"gozrd-admin-api/pkg/response"
	"strconv"
)

// DepartmentAPI 部门控制器
type DepartmentAPI struct {
	departmentService service.IDepartmentService
}

// NewDepartmentAPI 创建部门控制器
func NewDepartmentAPI(db *gorm.DB) *DepartmentAPI {
	departmentRepo := repository.NewDepartmentRepository(db)
	departmentService := service.NewDepartmentService(departmentRepo)
	return &DepartmentAPI{
		departmentService: departmentService,
	}
}

// GetSysDeptList 查询部门列表
// @Summary 查询部门列表接口
// @Description 根据条件查询部门列表
// @Tags 部门
// @Accept json
// @Produce json
// @Param deptName query string false "部门名称"
// @Param deptStatus query string false "部门状态：1->正常 2->停用"
// @Success 200 {object} response.Response "返回部门列表"
// @Router /dept/list [get]
func (d *DepartmentAPI) GetSysDeptList(c *gin.Context) {
	deptName := c.Query("deptName")
	deptStatus := c.Query("deptStatus")

	d.departmentService.GetSysDeptList(c, deptName, deptStatus)
}

// CreateSysDept 新增部门
// @Summary 新增部门接口
// @Description 创建一个新的部门
// @Tags 部门
// @Accept json
// @Produce json
// @Param data body model.SysDept true "部门信息"
// @Success 200 {object} response.Response "创建成功"
// @Router /dept [post]
func (d *DepartmentAPI) CreateSysDept(c *gin.Context) {
	var dept model.SysDept
	if err := c.ShouldBindJSON(&dept); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	d.departmentService.CreateSysDept(c, dept)
}

// GetSysDeptById 根据id查询部门
// @Summary 根据id查询部门接口
// @Description 获取指定ID的部门信息
// @Tags 部门
// @Accept json
// @Produce json
// @Param id path int true "部门ID"
// @Success 200 {object} response.Response "返回部门信息"
// @Router /dept/{id} [get]
func (d *DepartmentAPI) GetSysDeptById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		response.Fail(c, response.ErrParams, "无效的ID参数")
		return
	}

	d.departmentService.GetSysDeptById(c, id)
}

// UpdateSysDept 修改部门
// @Summary 修改部门接口
// @Description 更新部门信息
// @Tags 部门
// @Accept json
// @Produce json
// @Param data body model.SysDept true "部门信息"
// @Success 200 {object} response.Response "更新成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 500 {object} response.Response "内部错误"
// @Router /dept [put]
func (d *DepartmentAPI) UpdateSysDept(c *gin.Context) {
	var dept model.SysDept
	if err := c.ShouldBindJSON(&dept); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	d.departmentService.UpdateSysDept(c, dept)
}

// DeleteSysDeptById 根据id删除部门
// @Summary 根据id删除部门接口
// @Description 删除指定ID的部门
// @Tags 部门
// @Accept json
// @Produce json
// @Param data body dto.SysDeptIdDto true "部门ID"
// @Success 200 {object} response.Response "删除成功"
// @Router /dept [delete]
func (d *DepartmentAPI) DeleteSysDeptById(c *gin.Context) {
	var idDTO dto.SysDeptIdDto
	if err := c.ShouldBindJSON(&idDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	d.departmentService.DeleteSysDeptById(c, idDTO)
}

// QuerySysDeptVoList 部门下拉列表
// @Summary 部门下拉列表接口
// @Description 获取部门下拉列表数据
// @Tags 部门
// @Accept json
// @Produce json
// @Success 200 {object} response.Response "返回部门下拉列表"
// @Router /dept/list/options [get]
func (d *DepartmentAPI) QuerySysDeptVoList(c *gin.Context) {
	d.departmentService.QuerySysDeptVoList(c)
}
